package memberclass;
/*
    成员内部类中的访问问题:
        1. 在内部类中访问成员:
            a. 可以直接调用外部类的成员变量
            b. 可以直接调用自己类的成员变量
            c. 如果调用内外部类的同名变量,优先调自己类的 -> 就近原则
            d. 如果强制访问外部类成员位置的同名变量 : Outer.this.num
            e. 如果直接调用内外部同名方法,优先调用的是内部类的方法
            f. 如果强制访问外部类成员位置的同名方法 : Outer.this.方法名(实参);
        2. 在第三方类中访问内部类成员 :
                必须要创建成员内部类的对象:
                     Outer.Inner inner = new Outer().new Inner();
 */
public class Demo {
    public static void main(String[] args) {
        //创建Inner对象 要先有Outer对象
        Outer.Inner inner = new Outer().new Inner();
        System.out.println("inner.numIn = " + inner.numIn);
        System.out.println("inner.num = " + inner.num);//内部类的num
        inner.methodIn();
        inner.function();
        inner.method();
    }
}

class Outer{
    int numOut = 100;
    int num = 111;
    public void methodOut(){
        System.out.println("methodOut");
    }
    public void method(){
        System.out.println("外部类的method");
    }

    //成员内部类
    class Inner{
        int numIn = 200;
        int num = 222;
        public void methodIn(){
            System.out.println("methodIn");
        }
        public void method(){
            System.out.println("内部类的method");
        }

        public void function(){
            int num = 300;
            System.out.println("numOut = " + numOut);
            System.out.println("numIn = " + numIn);
            System.out.println("num = " + num);
            System.out.println("this.num = " + this.num);
            System.out.println("Outer.this.num = " + Outer.this.num);
            System.out.println("-----------------");
            methodOut();
            methodIn();
            this.method();
            Outer.this.method();
        }
    }
}


